package com.gzx.plugin.tjzy.modular.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Vector;

import org.springframework.web.multipart.MultipartFile;

import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import lombok.extern.slf4j.Slf4j;
import vip.xiaonuo.common.util.CommonDateUtil;

/**
 * @author xbl
 */
@Slf4j
public class SFtpUtil {
	public static List<String> getFiles(String host, int port, String username, String password, String localFilePath,
			String remoteDir) throws Exception {

		JSch jsch = new JSch();
		Session session = null;
		ChannelSftp sftpChannel = null;
		List<String> fileNames = Lists.newArrayList();
		try {
			// 1. 创建SFTP连接
			session = jsch.getSession(username, host, port);
			session.setPassword(password);
			session.setConfig("StrictHostKeyChecking", "no");
			session.connect();

			// 2. 打开SFTP通道
			Channel channel = session.openChannel("sftp");
			channel.connect();
			sftpChannel = (ChannelSftp) channel;

			sftpChannel.cd(remoteDir);
			Vector<ChannelSftp.LsEntry> fileList = sftpChannel.ls(remoteDir);
			for (ChannelSftp.LsEntry entry : fileList) {
				if (".".equals(entry.getFilename())) {
					continue;
				}
				if ("..".equals(entry.getFilename())) {
					continue;
				}
				fileNames.add(entry.getFilename());
			}

		} finally {
			// 5. 关闭连接
			if (sftpChannel != null && sftpChannel.isConnected()) {
				sftpChannel.exit();
			}
			if (session != null && session.isConnected()) {
				session.disconnect();
			}
		}
		return fileNames;

	}

	/**
	 * 上传文件到SFTP服务器（自动创建目录）
	 *
	 * @param host          服务器地址
	 * @param port          端口号
	 * @param username      用户名
	 * @param password      密码
	 * @param localFilePath 本地文件路径
	 * @param remoteDir     远程目录路径
	 * @param fileName      上传后的文件名
	 */
	public static void uploadFile(String host, int port, String username, String password, String localFilePath,
			String remoteDir, String fileName) throws Exception {

		JSch jsch = new JSch();
		Session session = null;
		ChannelSftp sftpChannel = null;

		try {
			// 1. 创建SFTP连接
			session = jsch.getSession(username, host, port);
			session.setPassword(password);
			session.setConfig("StrictHostKeyChecking", "no");
			session.connect();

			// 2. 打开SFTP通道
			Channel channel = session.openChannel("sftp");
			channel.connect();
			sftpChannel = (ChannelSftp) channel;

			// 3. 创建远程目录（如果不存在）
			createRemoteDir(sftpChannel, remoteDir);

			// 4. 上传文件
			try (InputStream inputStream = new FileInputStream(localFilePath)) {
				sftpChannel.cd(remoteDir);
				sftpChannel.put(inputStream, fileName);
				log.info("文件上传成功: {}/{}", remoteDir, fileName);
			}

		} finally {
			// 5. 关闭连接
			if (sftpChannel != null && sftpChannel.isConnected()) {
				sftpChannel.exit();
			}
			if (session != null && session.isConnected()) {
				session.disconnect();
			}
		}
	}

	/**
	 * 递归创建远程目录
	 */
	private static void createRemoteDir(ChannelSftp sftp, String remoteDir) throws SftpException {
		try {
			sftp.cd(remoteDir);
		} catch (SftpException e) {
			// 目录不存在，开始创建
			String[] folders = remoteDir.split("/");
			String path = "";
			for (String folder : folders) {
				if (folder.isEmpty())
					continue;
				path += "/" + folder;
				try {
					sftp.cd(path);
				} catch (SftpException ex) {
					sftp.mkdir(path);
					sftp.cd(path);
				}
			}
		}
	}

	// 测试示例
	public static void main(String[] args) {
		try {
			uploadFile("101.226.247.209", // SFTP服务器地址
					60022, // 端口
					"vcredit_test_guozhengxin", // 用户名
					"Vcredit-guozhengxin#20250624", // 密码
					"D:/asr/download/data-250618142215868.xlsx", // 本地文件路径
					"/upload/external/ZheJiangGuoZhengXin/coll_action/" + CommonDateUtil.getYearMonthDateStr(), // 远程目录（会自动创建）
//                    "/upload/external/ZheJiangGuoZhengXin/coll_action/" + CommonDateUtil.getYearMonthDateStr(),      // 远程目录（会自动创建）
					"data-250618142215868.xlsx" // 上传后的文件名
			);
		} catch (Exception e) {
			log.error("SFTP文件上传失败", e);
		}
	}

	// 转换成临时文件
	public static String transferFile(MultipartFile file) {
		String filePath = "";
		try {
			String originalFilename = file.getOriginalFilename();
			File tempDir = new File("/tmp/sftp");
			tempDir.mkdirs();
			// 创建一个临时文件
			File tempFile = new File("/tmp/sftp/" + originalFilename);

			// 将 MultipartFile 写入临时文件（会自动覆盖）
			file.transferTo(tempFile);

			// 获取文件路径
			filePath = tempFile.getAbsolutePath();
		} catch (IOException e) {
			log.error("上传诉讼文件转换失败");
		}
		return filePath;
	}
}